#include "thread_pool.h"
#define DIR_PATH "/home/ojm/samba_share/004_系统编程/011_线程池/threadpool-demo/images"
#define TARGET_PATH "/home/ojm/samba_share/004_系统编程/011_线程池/threadpool-demo/target"

thread_pool *pool;

// typedef struct file_path
// {
// 	char dir_path[512];
// 	char target_path[512];
// } file_path_t;

void *copytask(void *arg)
{
	int c;
	file_path_t *file_path = (file_path_t *)arg;
	// 打开需要复制的文件
	FILE *src_p = fopen(file_path->dir_path, "rb");
	FILE *target_p = fopen(file_path->target_path, "wb+");

	//
	// 将每一个字节复制进目标文件中
	printf("cpoy start.....[%s]\n", file_path->dir_path);
	do
	{
		c = fgetc(src_p);
		fputc(c, target_p);
		if (feof(src_p))
		{
			printf("cpoy done![%s]\n", file_path->dir_path);
			break;
		}
	} while (1);
	fclose(src_p);
	fclose(target_p);
	// 释放掉结构体申请的内存
	free(file_path);

	return NULL;
}

/**************************************************************************
 * @name: create_tasklist
 * @brief: 创建任务队列
 * @param {void} *arg
 * @note: None
 * @retval: None
 **************************************************************************/
void *create_tasklist(void *arg)
{
	// 1.读取该目录下的所有BMP图片的名称
	DIR *dir_p = opendir(DIR_PATH);
	// 2.读取目录文件中的目录项
	struct dirent *dirent_p = NULL;
	// 3.循环读取目录项
	while (dirent_p = readdir(dir_p))
	{
		struct stat sb;
		stat(dirent_p->d_name, &sb);
		if (dirent_p->d_name[0] != '.')
		// if (dirent_p->d_name[0] != '.' && (sb.st_mode & __S_IFMT) == __S_IFREG)
		{
			// 4.把每个BMP图片的名称和路径构造为一个字符串（表示BMP图片的绝对路径）
			file_path_t *file_path = calloc(1, sizeof(file_path_t));
			printf("文件名:%s, 文件类型:%d\n", dirent_p->d_name, sb.st_mode);
			sprintf(file_path->dir_path, "%s/%s", DIR_PATH, dirent_p->d_name);
			sprintf(file_path->target_path, "%s/%s", TARGET_PATH, dirent_p->d_name);
			// 5.把这个字符串作为任务的参数，构造为一个任务结点，然后把每个任务结点链在一起形成链队
			add_task(pool, copytask, (file_path_t *)file_path);
		}
	}
	closedir(dir_p);
}

int main(void)
{
	// 1.主线程创建一个线程池, initialize the pool（线程池中应该默认存在一些核心线程）
	pool = malloc(sizeof(thread_pool));
	init_pool(pool, 0);

	// 2.创建子线程处理images的图片构造任务队列
	pthread_t a;
	pthread_create(&a, NULL, create_tasklist, NULL);
	pthread_join(a, NULL);
	printf("处于等待状态的线程数量:%d\n", pool->waiting_tasks);
	printf("正在活跃的线程数量:%d\n", pool->active_threads);
	// printf("任务列表:%s\n", ((file_path_t *)pool->task_list->arg)->dir_path);
	// while (pool->task_list->next != NULL)
	// {
	// 	printf("当前的任务:%s\n", ((file_path_t *)pool->task_list->arg)->dir_path);
	// 	pool->task_list = pool->task_list->next;
	// 	sleep(1);
	// }

	add_thread(pool, 5);

	// 然后把任务队列中的所有任务都添加到线程池中
	// 要求每个线程都会输出一些提示信息, 比如在开始拷贝之前，输出”cpoy start.....”
	// 拷贝完成后输出”copy done!”

	// destroy the pool
	destroy_pool(pool);
	return 0;
}
